﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Script.Serialization;
namespace JsonSpliter
{
    /// <summary>
    /// JSON格式数据粘包分包处理
    /// </summary>
    public class Spliter
    {
        /// <summary>
        /// <para>JSON粘包处理</para>
        /// <para>把字符串中的符合JSON协议的数据提取出来</para>
        /// <para>返回值中的一项是一条符合协议的字符串</para>
        /// </summary>
        /// <param name="json">要进行粘包处理的字符串</param>
        /// <returns>返回一个list数组，每一项是一条符合JSON协议的字符串</returns>
        public static List<string> IsJsons(string json)
        {
            return Jsonsplit(json);
        }

        /// <summary>
        /// <para>JSON粘包处理</para>
        /// <para>把字节数组中的符合JSON协议的数据提取出来</para>
        /// <para>返回值中的一项是一条符合协议的字节数组</para> 
        /// </summary>
        /// <param name="json">要进行粘包处理的字节数组</param>
        /// <returns>返回一个list数组，每一项是一条符合JSON协议的字节数组</returns>
        public static List<byte[]> IsJsons(byte[] json)
        {
            return Jsonsplit(json);
        }

        internal static List<string> Jsonsplit(string json)
        {
            List<string> GetJson = new List<string>();
            List<byte> JS = new List<byte>();
            JS.AddRange(System.Text.Encoding.Default.GetBytes(json));
            JavaScriptSerializer jds = new JavaScriptSerializer();
            for (int i = 0; i < JS.Count; i++)
            {
                if (JS.Count < 3)
                    break;
                if (JS[0] == '{')
                {
                    for (int j = JS.Count - 1; j >= 0; j--)
                    {
                        if (JS[j] == '}')
                        {
                            byte[] str = new byte[j + 1];
                            Array.Copy(JS.ToArray(), str, j + 1);
                            string jsonstring = System.Text.Encoding.Default.GetString(str);
                            try
                            {
                                dynamic dc = jds.Deserialize<dynamic>(jsonstring);
                                GetJson.Add(jsonstring);
                                JS.RemoveRange(0, j);
                                break;
                            }
                            catch { };
                        
                        }
                    }
                }
                JS.RemoveAt(0);

            }
            return GetJson;
        }

        internal static List<byte[]> Jsonsplit(byte[] json)
        {
            List<byte[]> GetJson = new List<byte[]>();
            List<byte> JS = new List<byte>();
            JS.AddRange(json);
            JavaScriptSerializer jds = new JavaScriptSerializer();
            for (int i = 0; i < JS.Count; i++)
            {
                if (JS.Count < 3)
                    break;
                if (JS[0] == '{')
                {
                    for (int j = JS.Count - 1; j >= 0; j--)
                    {
                        if (JS[j] == '}')
                        {
                            byte[] str = new byte[j + 1];
                            Array.Copy(JS.ToArray(), str, j + 1);
                            string jsonstring = System.Text.Encoding.Default.GetString(str);
                            try
                            {
                                dynamic dc = jds.Deserialize<dynamic>(jsonstring);
                                GetJson.Add(str);
                                JS.RemoveRange(0, j);
                                break;
                            }
                            catch { };

                        }
                    }
                }
                JS.RemoveAt(0);

            }
            return GetJson;
        }

    }
}
